package com.ywd.materials.admin.utils;

import com.ywd.materials.admin.vo.AdminMenuTreeVo;
import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 组织树形结构工具类
 */
public class TreeMenuUtil {

    /**
     * 构建树形结构（优化版）
     * @param list 所有组织节点列表
     * @return 树形结构列表
     */
    public static List<AdminMenuTreeVo> buildWarehouseTree(List<AdminMenuTreeVo> list) {
        if (CollectionUtils.isEmpty(list)) {
            return Collections.emptyList();
        }

        // 使用LinkedHashMap保持插入顺序
        Map<Long, AdminMenuTreeVo> nodeMap = new LinkedHashMap<>(list.size());
        List<AdminMenuTreeVo> rootNodes = new ArrayList<>();

        // 第一次遍历：构建节点映射，识别根节点
        for (AdminMenuTreeVo node : list) {
            nodeMap.put(node.getId(), node);

            Long parentId = node.getPid();
            if (isRootNode(parentId)) {
                rootNodes.add(node);
            }
        }

        // 第二次遍历：构建父子关系
        for (AdminMenuTreeVo node : list) {
            Long parentId = node.getPid();
            if (!isRootNode(parentId)) {
                AdminMenuTreeVo parent = nodeMap.get(parentId);
                if (parent != null) {
                    if (parent.getChildren() == null) {
                        parent.setChildren(new ArrayList<>());
                    }
                    parent.getChildren().add(node);
                } else {
                    // 父节点不存在，将其作为根节点
                    rootNodes.add(node);
                }
            }
        }

        return rootNodes;
    }

    /**
     * 判断是否为根节点
     */
    private static boolean isRootNode(Long parentId) {
        return parentId == null || parentId == 0L;
    }

    /**
     * 递归构建树形结构（备选方案）
     * @param list 所有组织节点列表
     * @return 树形结构列表
     */
    public static List<AdminMenuTreeVo> buildMenuTreeListRecursive(List<AdminMenuTreeVo> list) {
        List<AdminMenuTreeVo> treeList = new ArrayList<>();
        // 查找所有根节点
        List<AdminMenuTreeVo> rootNodes = list.stream()
                .filter(node -> node.getPid() == null || node.getPid().equals(0L))
                .collect(Collectors.toList());

        // 为每个根节点构建子树
        for (AdminMenuTreeVo root : rootNodes) {
            AdminMenuTreeVo rootTree = findChildren(root, list);
            treeList.add(rootTree);
        }
        return treeList;
    }

    /**
     * 递归查找子节点
     * @param parentNode 父节点
     * @param list 所有节点列表
     * @return 带子节点的父节点
     */
    private static AdminMenuTreeVo findChildren(AdminMenuTreeVo parentNode, List<AdminMenuTreeVo> list) {
        List<AdminMenuTreeVo> children = new ArrayList<>();

        // 查找直接子节点
        for (AdminMenuTreeVo node : list) {
            if (parentNode.getId().equals(node.getPid())) {
                // 递归构建子树
                AdminMenuTreeVo childNode = findChildren(node, list);
                children.add(childNode);
            }
        }

        if (!children.isEmpty()) {
            parentNode.setChildren(children);
        }
        return parentNode;
    }
}
